package bancosys.tec.security.web;

import java.io.IOException;
import java.io.Serializable;
import java.util.Map;

import jmine.tec.utils.collection.ClasspathPropertiesLoader;

/**
 * Usado para fazer um mapeamento entre as paginas e uma chave. Le o mapeamento a partir de todos os arquivos no classpath com o nome
 * 'pages.properties', que deve estar em ISO-8859 e possuir um mapemento entre o path do servlet (como devolvido pelo metodo
 * getServletPath() do HttpServletRequest) e uma chave que vai ser usada para comparar
 * 
 * @author takeshi
 */
public final class PageMapping implements Serializable {

    private final Map<String, String> mapping;

    /**
     * Construtor que vai ler os arquivos 'pages.properties'. Relanca a excecao se nao conseguir ler algum dos arquivos
     * 
     * @throws IOException e
     */
    private PageMapping() throws IOException {
        this.mapping = new ClasspathPropertiesLoader("pages.properties").getProperties();
    }

    private static final PageMapping INSTANCE;
    static {
        try {
            INSTANCE = new PageMapping();
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * Metodo estatico que devolve a instancia unica (para evitar varias inicializacoes)
     * 
     * @return {@link PageMapping}
     */
    public static PageMapping getInstance() {
        return INSTANCE;
    }

    /**
     * Devolve a chave dado um servletPath. Devolve o proprio servletPath se nao houver mapeamento para o servletPath passado
     * 
     * @param servletPath String
     * @return String
     */
    public String getKeyForPageOrPage(String servletPath) {
        final String r = mapping.get(servletPath);
        return r == null ? servletPath : r;
    }

}
